package controller

import (
	"github.com/gin-gonic/gin"
	"gormstu/model"
	"net/http"
)

type OptTable struct {
}

// AddController 增加
func (opt OptTable) AddController(ctx *gin.Context) {
	user := model.User{
		Username: "lion",
		Age:      26,
		Email:    "111@000.com",
		AddTime:  model.GetUnixSecond(),
	}

	model.DB.Create(&user)

	// 插入之后查询结果查询结果

	model.DB.Where("username = ?", "lion").Find(&user)
	ctx.JSON(http.StatusOK, gin.H{
		"code": 0,
		"msg":  "插入成功",
		"data": user,
	})

}

// SearchController 查询 ==> select * from user
func (opt OptTable) SearchController(ctx *gin.Context) {
	// 实例化 model.user 表
	var user []model.User
	// 查询 user 全表
	model.DB.Find(&user)

	ctx.JSON(http.StatusOK, gin.H{
		"code": 0,
		"msg":  "查询成功",
		"data": user,
	})
}

// SearchTestController 测试直接在 user 加参的查询 == >  不行
func (opt OptTable) SearchTestController(ctx *gin.Context) {
	// 实例化 model.user 表
	user := model.User{Id: 2}

	// 查询 user 全表
	model.DB.Find(&user)
	ctx.JSON(http.StatusOK, gin.H{
		"code": 0,
		"msg":  "查询成功",
		"data": user,
	})
}

// ConditionController 带条件查询  select * from user where xxx
func (opt OptTable) ConditionController(ctx *gin.Context) {
	var user []model.User
	model.DB.Where("age > ?", 18).Find(&user)

	ctx.JSON(http.StatusOK, gin.H{
		"code": 0,
		"msg":  "查询成功",
		"data": user,
	})
}

// ModifiedController 更新整行 ==> 建议使用该方法
func (opt OptTable) ModifiedController(ctx *gin.Context) {

	user := model.User{Id: 2}
	// 先查出来, 查询 id = 2 的数据
	model.DB.Find(&user)

	// 修改
	user.Username = "elephant"
	model.DB.Save(&user)

	// 在查一次
	model.DB.Find(&user)
	ctx.JSON(http.StatusOK, gin.H{
		"code": 0,
		"msg":  "查询成功",
		"data": user,
	})
}

// ModifiedMarkController 更新一行中的部分字段 == > 不建议使用
func (opt OptTable) ModifiedMarkController(ctx *gin.Context) {

	user := model.User{}
	// 直接修改
	model.DB.Model(&user).Where("id = ?", 4).Update("username", "rabbit")
	// 在查一次
	model.DB.Where("id = ?", 4).Find(&user)
	ctx.JSON(http.StatusOK, gin.H{
		"code": 0,
		"msg":  "修改成功",
		"data": user,
	})
}

// DeleteSingleController 删除一条数据 ==> 被删除的数据再次执行查询会查不到内容, 仅显示条件其余字段为默认值
func (opt OptTable) DeleteSingleController(ctx *gin.Context) {
	user := model.User{Id: 1}
	model.DB.Delete(&user)
	model.DB.Find(&user)
	ctx.JSON(http.StatusOK, gin.H{
		"code": 0,
		"msg":  "删除成功",
		"data": user,
	})
}
